// 开发环境插件
import type { Plugin } from 'vite'
import type { AddressInfo } from "net"
import { spawn } from "child_process"
import fs from "fs"
import path from 'path'

export const ElectronDevPlugin = (): Plugin => {
    return {
        name: 'electron-dev',
        // 服务相关配置
        configureServer(server) {
            const buildBackground = () => {
                // electron主进程ts文件编译成js
                require('esbuild').buildSync({
                    // 入口文件
                    entryPoints: ['src/background.ts'],
                    // 出口文件 
                    outfile: 'dist/background.js',
                    // 是否打包所有依赖
                    bundle: true,
                    // 环境
                    platform: 'node',
                    // 版本
                    target: 'node18',
                    external: ['electron'],
                })
            }
            buildBackground()
            // 监听服务启动钩子
            server.httpServer?.once('listening', () => {
                // 读取vite服务信息(端口号)
                const addressInfo = server.httpServer?.address() as AddressInfo
                // 拼接ip地址 给electron启动服务用
                const IP = `http://localhost:${addressInfo.port}`

                /**
                 * 获取进程信息 进程传参 发送给electron Ip地址
                 * @param 启动electron require('electron')返回一个路径
                 * @param electron配置文件
                 */
                let electronProcess = spawn(require('electron'), ['dist/background.js', IP])
                // 热更新 监听src/background.ts
                fs.watchFile('src/background.ts', () => {
                    // 关掉进程
                    electronProcess.kill()
                    // 重新编译
                    buildBackground()
                    // 重新打开进程
                    electronProcess = spawn(require('electron'), ['dist/background.js', IP])
                })

                electronProcess.stderr.on('data', (data) => {
                    console.log('日志' + data.toString())
                })
                console.log(IP)
            })
        },
    }
}